<?php
namespace App\Helpers;

class NumberHelper{
    /**
     * 将传入数字格式化为指定长度
     *  - 若源数据超过指定长度，会把超过部分高位截断
     *  - 若源数据小于指定长度，会在前面补零
     * @param int $value 数据（非数字格式会用intval进行强转）
     * @param int $length 指定长度
     * @return string
     */
    public static function toLength($value, $length){
        if(!self::isInt($value)){
            $value = intval($value);
        }
        
        $value_length = strlen($value);
        if($value_length > $length){
            return substr($value, $value_length - $length);
        }else if($value_length < $length){
            return str_pad($value, $length, '0', STR_PAD_LEFT);
        }else{
            return (string)$value;
        }
    }
    
    /**
     * 是否为整数。与系统函数is_int不同，此函数只关心格式是否正确，不关心变量类型。
     * 此函数不接受"+1"这样的正数写法，也不接受"00", "09"这样不符合正常习惯的前导0写法，"-0", "+0"也都是不行的。
     * 但如果是int类型的变量，则无法区分是否有前导0或者+。
     * @param int|string $str
     * @param bool $natural_number_only 若为true，则只能是正整数或0（自然数），默认为true
     * @return bool
     */
    public static function isInt($str, $natural_number_only = true){
        if(!is_string($str) && !is_int($str)){
            //如果不是string或int类型，直接返回false
            return false;
        }
        if($natural_number_only){
            return !!preg_match('/^(0|[1-9]\d*)$/', $str);
        }else{
            return !!preg_match('/^(0|-?[1-9]\d*)$/', $str);
        }
    }

    /**
     * 随机字符串
     *
     * @param string $type
     *  - alpha: 含有大小写字母。
     *  - alnum: 含有大小写字母以及数字。
     *  - numeric: 数字字符串。
     *  - nozero: 不含零的数字字符串。
     *  - unique: 用 MD5 and uniqid()加密的字符串。注意：第二个长度参数在这种类型无效。均返回一个32位长度的字符串。
     *  - uuid: 生成一个UUID。注意：第二个长度参数在这种类型无效。均返回一个36位长度的字符串。
     * @param int $length
     * @return string
     */
    public static function random($type = 'alnum', $length = 16) {
        switch ($type) {
            case 'basic':
                return mt_rand();
                break;
            case 'alnum':
            case 'numeric':
            case 'nozero':
            case 'alpha':

                switch ($type) {
                    case 'alpha' :
                        $pool = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
                        break;
                    case 'alnum' :
                        $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
                        break;
                    case 'numeric' :
                        $pool = '0123456789';
                        break;
                    case 'nozero' :
                        $pool = '123456789';
                        break;
                }

                $str = '';
                for($i = 0; $i < $length; $i ++){
                    $str .= substr($pool, mt_rand(0, strlen($pool) - 1), 1);
                }
                return $str;
                break;
            case 'unique':
            case 'md5':
                return md5(uniqid(mt_rand()));
                break;
            case 'uuid':
                return self::guidv4();
                break;
        }
    }



}